package main

import (
	"context"
	"fmt"
	"os"
	"os/signal"
	"time"
)

func main() {
	//当列出的信号之一到达、调用返回的停止函数或父上下文的 Done 通道关闭时，NotifyContext 返回标记为完成（其 Done 通道关闭）的父上下文的副本，以先发生者为准。
	//
	//stop 函数取消注册信号行为，这与 signal.Reset 一样，可以恢复给定信号的默认行为。 例如，Go 程序接收 os.Interrupt 的默认行为是退出。 调用 NotifyContext(parent, os.Interrupt) 将改变取消返回上下文的行为。 在调用返回的停止函数之前，接收到的未来中断不会触发默认（退出）行为。
	//
	//stop 函数会释放与其关联的资源，因此一旦在此上下文中运行的操作完成并且信号不再需要转移到上下文，代码应立即调用 stop。

	ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt)
	defer stop()

	//找到当前进程
	p, err := os.FindProcess(os.Getpid())
	if err != nil {
		return
	}

	//触发os.Interrupt 信号
	p.Signal(os.Interrupt)
	select {
	case <-time.After(time.Second):
		fmt.Println("missing signal")
	case <-ctx.Done():
		fmt.Println(ctx.Err())
		stop()
	}
}
